#  Copyright 2008-2011 Nokia Siemens Networks Oyj
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

from erlastic.types import Atom


_WILD_CARD_STR = '?'
_WILD_CARD_ATOM = Atom('?')


def compare(expected, actual):
    if expected in [_WILD_CARD_ATOM, _WILD_CARD_STR]:
        return True
    elif type(expected) != type(actual):
        raise AssertionError("%s is not same type as %s" % (expected, actual))
    elif isinstance(expected, list) or \
       isinstance(expected, tuple):
        return _compare_lists(expected, actual)
    elif isinstance(expected, dict):
        return _compare_dicts(expected, actual)
    elif expected != actual:
        raise AssertionError('%s does not equal %s' % (expected, actual))
    return True

def _compare_lists(expected, actual):
    for a,b in zip(expected, actual):
        compare(a,b)
    return True

def _compare_dicts(expected, actual):
    for key in expected:
        if key not in actual:
            raise AssertionError("%s not in %s" % (key, actual))
        compare(expected[key], actual[key])
    return True


